#!/usr/bin/env bash
###################################################################
# Function :安装yum源                                              #
# Platform :RedHatEL7.x Based Platform                            #
# Version  :1.0                                                   #
# Date     :2021-07-17                                            #
# Author   :houxiaoshuai@baidu.com & hxsaj@126.com                #
###################################################################
set -e

#  变量列表 Variable list
########## ########## ########## ########## ########## ########## #
#  指定镜像存放的位置
iso_dir=/iso
#  指定挂载点
iso_mount_dir=${iso_dir}/os

#  函数列表 Function list
########## ########## ########## ########## ########## ########## #
#  提示的色彩    echo -e "\033[38;46m 色彩测试-提示 \033[0m"
function show_notice() {
    echo -e "\033[34;46m $@ \033[0m" >&1
}
#  警告的色彩    echo -e "\033[35;46m 色彩测试-警告 \033[0m"
function show_warning() {
    echo -e "\033[35;46m $@ \033[0m" >&2
}
#  报错的色彩   echo -e "\033[1;31;46m 色彩测试-错误 \033[0m"
function show_error() {
    echo -e "\033[1;31;46m $@ \033[0m" >&2

}
#  获取本机 IP 地址
function get_host_ip() {
    ip a | grep -w inet | grep -v docker | grep -w global | awk -F "/" '{print $1}' | awk '{print $2}'
}

#  镜像挂载，参数：iso位置
function mount_iso() {
    #  检查镜像文件存放目录和挂载目录
    iso_name=$(basename ${1})
    mount_i(){
        if [ -d ${iso_mount_dir} ];then
            if df -hT | grep -e ${iso_mount_dir} | grep iso9660 >/dev/null 2>&1; then
                show_notice " 此镜像已经挂载 ！" && exit 1
            elif [ $(ls -A ${iso_mount_dir} | wc -w) -eq 0 ]; then
                mount -t iso9660 ${iso_dir}/${1} ${iso_mount_dir} >/dev/null 2>&1
            else
                show_warning " 挂载点 ${iso_mount_dir} 不为空！ "
            fi
        else
            mkdir -p ${iso_mount_dir}
            mount -t iso9660 ${iso_dir}/${1} ${iso_mount_dir} >/dev/null 2>&1
        fi
    }

    #  检查文件存放位置
    if [ -d ${iso_dir} ];then
        if [ -f ${iso_dir}/${iso_name} ];then
            mount_i ${iso_name}
        else
            cp ${1} ${iso_dir}/
            mount_i ${iso_name}
        fi
    else
        mkdir -p ${iso_dir}
        cp ${1} ${iso_dir}/
        mount_i ${iso_name}
    fi

    #  备份同名yum源文件
    [ -f /etc/yum.repos.d/base_iso.repo ] && cp -a /etc/yum.repos.d/base_iso.repo{,.$(date +%Y-%m-%d_%H%M%S)}
    #  生成本地yum源文件
    cat >/etc/yum.repos.d/base_iso.repo <<EOF
[iso]
name=iso
baseurl=file://${iso_mount_dir}
enabled=1
gpgcheck=0
EOF

    #  清空yum元数据
    yum clean all >/dev/null 2>&1
    #  生产yum元数据
    yum makecache >/dev/null 2>&1
    #  提示
    show_notice " 本地yum环境部署完成！ "

}

#  本地yum卸载
function uninstall_local_yum() {
    #  删除repo文件
    rm -f /etc/yum.repos.d/base_iso.repo

    #  卸载
    umount ${iso_mount_dir}

    #  提示
    show_notice " 本地 yum 环境已删除 "

}

#  基于http的yum源
function release_http_yum() {
    #  安装http
    [ $(rpm -qa | grep httpd | wc -l) -eq 0 ] && yum install httpd -y >/dev/null 2>&1

    #  将 yum 源软连接到httpd服务目录下
    [ ! -h /var/www/html/iso ] && ln -s ${iso_mount_dir} /var/www/html/iso

    #  启动 httpd
    systemctl restart httpd

    #  生成http repo文件
    cat >./base_http_iso.repo <<EOF
[iso]
name=iso
baseurl=http://$(get_host_ip)/iso
enabled=1
gpgcheck=0
EOF

    #  打印文件信息
    show_notice " 已生成base_http_iso.repo文件，复制到客户端服务器即可使用yum服务！ "

}

#  关闭 基于http的yum源
function unrelease_http_yum() {
    #  删除软连接
    rm -f /var/www/html/iso
    [ -f ./base_http_iso.repo ]&& rm -f ./base_http_iso.repo

    #  提示
    show_notice " yum http服务已关闭 "
}

# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
if [ -z ${1} ];then
    echo "e.g.: $0 [ {iso_path} | yumhttp | unyumhttp | unyumlocal ]" && exit
elif [ -f ${1} ];then
    mount_iso ${1}
else
    #  根据传参确定
    case ${1} in
        "yumhttp") release_http_yum ;;
        "unyumhttp") unrelease_http_yum ;;
        "unyumlocal") uninstall_local_yum ;;
        # 输入不规范提示并退出
        *) echo "e.g.: $0 [ yumlocal | yumhttp | unyumhttp | unyumlocal ]" && exit ;;
    esac
fi
